package com.leo.base_project.Utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
* @program: com.leo.base_project.Utils
* @description: Excel操作工具类
* @author: Leo
* @create: 2021/3/29 15:59
**/
public class ExcelUtils {

    // @Value("${file_base_path}")
    // private static String fileBasePath;//文件的基础路径
    // private static String fileBasePath = System.getProperty("user.dir") + File.separator + "excel" + File.separator;;//文件的基础路径

    public static final String OFFICE_EXCEL_XLS = "xls";
    public static final String OFFICE_EXCEL_XLSX = "xlsx";

//    /**
//     * 读取指定Sheet也的内容
//     *
//     * @param filepath filepath 文件全路径
//     * @param sheetNo  sheet序号,从0开始,如果读取全文sheetNo设置null
//     */
//    public static String readExcel(String filepath, Integer sheetNo)
//            throws EncryptedDocumentException, InvalidFormatException, IOException {
//        StringBuilder sb = new StringBuilder();
//        Workbook workbook = getWorkbook(filepath);
//        if (workbook != null) {
//            if (sheetNo == null) {
//                int numberOfSheets = workbook.getNumberOfSheets();
//                for (int i = 0; i < numberOfSheets; i++) {
//                    Sheet sheet = workbook.getSheetAt(i);
//                    if (sheet == null) {
//                        continue;
//                    }
//                    sb.append(readExcelSheet(sheet));
//                }
//            } else {
//                Sheet sheet = workbook.getSheetAt(sheetNo);
//                if (sheet != null) {
//                    sb.append(readExcelSheet(sheet));
//                }
//            }
//        }
//        return sb.toString();
//    }

    /**
     * 根据文件路径获取Workbook对象
     *
     * @param filepath 文件全路径
     */
    public static Workbook getWorkbook(String filepath)
            throws EncryptedDocumentException, IOException {
        InputStream is = null;
        Workbook wb = null;
        if (StringUtils.isBlank(filepath)) {
            throw new IllegalArgumentException("文件路径不能为空");
        } else {
            String suffixed = getSuffiex(filepath);
            if (StringUtils.isBlank(suffixed)) {
                throw new IllegalArgumentException("文件后缀不能为空");
            }
            if (OFFICE_EXCEL_XLS.equals(suffixed) || OFFICE_EXCEL_XLSX.equals(suffixed)) {
                try {
                    is = new FileInputStream(filepath);
                    wb = WorkbookFactory.create(is);
                } finally {
                    if (is != null) {
                        is.close();
                    }
                    if (wb != null) {
                        wb.close();
                    }
                }
            } else {
                throw new IllegalArgumentException("该文件非Excel文件");
            }
        }
        return wb;
    }

    /**
     * 获取后缀
     *
     * @param filepath filepath 文件全路径
     */
    private static String getSuffiex(String filepath) {
        if (StringUtils.isBlank(filepath)) {
            return "";
        }
        int index = filepath.lastIndexOf(".");
        if (index == -1) {
            return "";
        }
        return filepath.substring(index + 1, filepath.length());
    }

    public static String readByColumn(String filepath, int column, int start_row) throws IOException {
        Workbook workbook = getWorkbook(filepath);
        Sheet sheet = workbook.getSheetAt(0);
        StringBuilder sb = new StringBuilder();

        if (sheet != null) {
            int rowNos = sheet.getLastRowNum();// 得到excel的总记录条数
            for (int i = start_row; i <= rowNos; i++) {// 遍历行
                Row row = sheet.getRow(i);
                if (row != null) {
                    Cell cell = row.getCell(column);
                    sb.append(cell.getStringCellValue()).append(" ");
                }
            }
        }

        return sb.toString();

    }

//    public static List<DistanceRefer> getDistanceList(String filepath) {
//        List<DistanceRefer> refer = new ArrayList<>();
//        try {
//            Workbook workbook = getWorkbook(filepath);
//            Sheet sheet = workbook.getSheetAt(0);
//            if (sheet != null) {
//                int rowNos = sheet.getLastRowNum();// 得到excel的总记录条数
//                for (int i = 2; i <= rowNos; i++) {// 遍历行
//                    Row row = sheet.getRow(i);
//                    if (row != null) {
//                        Cell cell = row.getCell(0);
//                        Double km = ExcelUtils.string2double(cell.getStringCellValue());
//                        if (km == null) return refer;
//                        cell = row.getCell(1);
//                        double base = cell.getNumericCellValue();
//                        refer.add(new DistanceRefer(km, base));
//                    }
//                }
//                return refer;
//            }
//        } catch (Exception e) {
//            AlertUtils.error("出现错误" + e.getMessage());
//        }
//        return refer;
//    }
//
//    private static String readExcelSheet(Sheet sheet) {
//        StringBuilder sb = new StringBuilder();
//
//        if (sheet != null) {
//            int rowNos = sheet.getLastRowNum();// 得到excel的总记录条数
//            for (int i = 0; i <= rowNos; i++) {// 遍历行
//                Row row = sheet.getRow(i);
//                if (row != null) {
//                    int columNos = row.getLastCellNum();// 表头总共的列数
//                    for (int j = 0; j < columNos; j++) {
//                        Cell cell = row.getCell(j);
//                        if (cell != null) {
//                            cell.setCellType(CellType.STRING);
//                            sb.append(cell.getStringCellValue()).append(" ");
//                        }
//                    }
//                    // System.out.println();
//                }
//            }
//        }
//
//        return sb.toString();
//    }
//
//    public static void outputExcel(String filePath, Record record, List<RecordItem> recordItems) {
//        try {
//            //创建工作薄对象
//            HSSFWorkbook workbook = new HSSFWorkbook();//这里也可以设置sheet的Name
//            //创建工作表对象
//            HSSFSheet sheet = workbook.createSheet();
//            //创建工作表的行
//            HSSFRow row = sheet.createRow(0);//设置第一行，从零开始
//
////            sheet.setDefaultRowHeight((short) (2 * 256)); //设置默认行高，表示2个字符的高度
//            sheet.setColumnWidth(0, 16 * 256);
//            sheet.setColumnWidth(1, 16 * 256);
//            sheet.setColumnWidth(2, 16 * 256);
//            sheet.setColumnWidth(3, 16 * 256);
//            sheet.setColumnWidth(4, 16 * 256);
//
//            HSSFCellStyle style = workbook.createCellStyle();
//            style.setAlignment(HorizontalAlignment.CENTER);
//            style.setVerticalAlignment(VerticalAlignment.CENTER);
//
//            //构造参数依次表示起始行，截至行，起始列， 截至列
//            // 合并第一行
//            CellRangeAddress region = new CellRangeAddress(0, 0, 0, 2);
//            sheet.addMergedRegion(region);
//            row.createCell(0).setCellValue("线名：" + record.getLineName());
//
//            // 第二行
//            row = sheet.createRow(1);
//            region = new CellRangeAddress(1, 1, 0, 2);
//            sheet.addMergedRegion(region);
//            row.createCell(0).setCellValue(String.format("起点里程: %skm+%sm", record.getStartKm(), record.getStartM()));
//
//            // 第三行
//            row = sheet.createRow(2);
//            row.createCell(0).setCellValue("里程(m)");
//            row.createCell(1).setCellValue("基准轨长弦");
//            row.createCell(2).setCellValue("水平偏差");
//            row.createCell(3).setCellValue("标准轨向偏差");
//            row.createCell(4).setCellValue("备注");
//
//            // 第四行
//            row = sheet.createRow(3);
//            region = new CellRangeAddress(2, 3, 0, 0);
//            sheet.addMergedRegion(region);
//
//
//            row.createCell(1).setCellValue("轨向偏差(mm)");
//            row.createCell(2).setCellValue("偏差(mm)");
//            row.createCell(3).setCellValue("偏差(mm)");
//
//
//            region = new CellRangeAddress(2, 3, 4, 4);
//            sheet.addMergedRegion(region);
//
//
//            // 后面几行
//            for (int i = 0; i < recordItems.size(); i++) {
//                row = sheet.createRow(i + 4);
//                RecordItem recordItem = recordItems.get(i);
//                row.createCell(0).setCellValue(double2string(recordItem.getDistance()));
//                row.createCell(1).setCellValue(recordItem.getHorizontal());
//                row.createCell(2).setCellValue(recordItem.getBase());
//                row.createCell(3).setCellValue(recordItem.getStandard());
//                row.createCell(4).setCellValue(recordItem.getNote());
//            }
//
//            //文档输出
//            FileOutputStream out = new FileOutputStream(filePath);
//            workbook.write(out);
//            out.close();
//            AlertUtils.successOnTop("导出成功", LaserApplication.getScene().getWindow());
//        } catch (Exception exception) {
//            exception.printStackTrace();
//            AlertUtils.errorOnTop("导出失败" + exception.getMessage(), LaserApplication.getScene().getWindow());
//        }
//    }

    // 将10+312.231转换为10312.231
    public static Double string2double(String str) {
        String[] split = str.trim().split("\\+");
        if (split.length >= 2)
            return Integer.parseInt(split[0]) * 1000 + Double.parseDouble(split[1]);
        return null;
    }

    // 将12000.212 转换成12+0.212
    public static String double2string(Double num) {

        DecimalFormat df = new DecimalFormat("0.000");
        String format = df.format(num);
        // 如果是不到一千米直接返回
        if (num < 1000) return format;
        // 如果大于一千米 分割后返回
        String m = format.substring(format.length() - 7);
        // 去掉可能出现的开头0
        m = String.valueOf(Double.parseDouble(m));
        String km = format.substring(0, format.length() - 7);

        return km + "+" + m;

    }
}